package ReflectionLearn;




import org.junit.jupiter.api.Test;

import java.lang.reflect.InvocationTargetException;
import java.util.Random;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-07 0:15
 * @description 通过反射创建对应的运行时类的对象
 */
public class NewInstanceTest {

    @Test
    public void test1() throws Exception {
        Class<Person> clazz=Person.class;
        /*
        newInstance():调用此方法，创建对用的运行时类的对象

        要想此方法正确创建运行时类的对象，要求
        1.运行时类必须提供空参的构造器
        2.空参构造器的访问权限得够，通常设置为public

        在javabean中要求提供一个public的空参构造器，原因：
            1.便于通过反射，创建运行时类的对象
            2.便于子类继承运行时类时，默认调用super()时，保证父类有此构造器

         */
        Person p=clazz.getDeclaredConstructor().newInstance();
        System.out.println(p);
    }

    @Test
    public void test2() throws Exception {
        int num=new Random().nextInt(3);//0,1,2
        String classPatch="";
        switch(num){
            case 0:
                classPatch="java.util.Date";
                break;
            case 1:
                classPatch="java.sql.Date"; //sql.Date没有空参构造器，会报错
                break;
            case 2:
                classPatch="ReflectionLearn.Person";
                break;
        }
        Object o=getInstance(classPatch);
        System.out.println(o);
    }

    /**
     * 创建一个指定类的对象
     * @param classPath
     * @return 指定类的全类名
     * @throws Exception
     */
    public Object getInstance(String classPath) throws Exception{
        Class clazz=Class.forName(classPath);
        return clazz.getDeclaredConstructor().newInstance();
    }
}
